home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Floppyshop 2
/
Floppyshop - 2.zip
/
Floppyshop - 2.iso
/
art&graf.ix
/
art-3139
/
stadconv
/
fromstad.asm
next >
Wrap
Assembly Source File
|
1987-04-21
|
8KB
|
158 lines
*****************************************************************************
* *
* Ass-Unterroutine zum Konvertieren eines gepackten STAD-Bildes in ein 32k *
* grosses Bild (Screenformat). *
* *
* Aufruf: (sp) LONG Rücksprungadresse *
* 4(sp) LONG Adresse des gepackten STAD-Bildes *
* 8(sp) LONG Adresse des Zielbildes (32k Buffer) *
* Rückgabe: d0 0 = Konvertierung erfolgreich *
* 1 = Bild ist nicht STAD-gepackt *
* *
* History: *
* Version 1.0 01.06.1991 Wolfgang Ley *
* - Urversion *
* Version 1.1 03.06.1991 Wolfgang Ley *
* - Rettung der Register eingeführt *
* Version 1.2 05.06.1991 Wolfgang Ley *
* - Extra-Zaehler aus v_lese ausgebaut *
* *
*****************************************************************************
TEXT
movem.l D1-D5/A0-A1,-(SP) ;Registerinhalt sichern
movea.l 32(SP),A0 ;Adresse des gepackten STAD-Bildes
movea.l 36(SP),A1 ;Adresse des Zielbildes (32k)
; ---------------------------------------------------------------------------
; STAD-Header:
; Byte 1-4 String 'pM85' (horizontal gepackt)
; 'pM86' (vertikal gepackt)
; Byte 5 ID-Byte
; Byte 6 PACK-Byte
; Byte 7 SPECIAL-Byte
; .... Bilddaten
; ---------------------------------------------------------------------------
move.b 4(A0),D1 ;ID-Byte lesen
move.b 5(A0),D2 ;PACK-Byte lesen
move.b 6(A0),D3 ;SPEC-Byte lesen
clr.w D4 ;offset für Zielbild löschen
cmpi.b #'p',(A0)+ ;Erstes Byte = "p"
bne.s fehler
cmpi.b #'M',(A0)+ ;Zweites Byte = "M"
bne.s fehler
cmpi.b #'8',(A0)+ ;Drittes Byte = "8"
bne.s fehler
cmpi.b #'5',(A0) ;Viertes Byte = "5"
beq.s h_start ;-> horizontal gepackt
cmpi.b #'6',(A0) ;Viertes Byte = "6"
beq.s v_start ;-> vertikal gepackt
fehler: move.l #1,D0 ;Fehler 1 = kein gepacktes STAD-Bild
exit: movem.l (SP)+,D1-D5/A0-A1 ;Register wieder herstellen
rts
; ---------------------------------------------------------------------------
; Horizontale Auspack-Routine
; ---------------------------------------------------------------------------
h_start: addq.l #4,A0 ;Header ueberspringen
h_lese: move.b (A0)+,D0 ;naechstes Byte lesen
cmp.b D1,D0 ;ID-Byte gelesen?
beq.s h_use_pack ;ja -> use PACK-Byte
cmp.b D3,D0 ;SPEC-Byte gelesen?
beq.s h_use_spec ;ja -> use SPEC-Byte
move.b D0,0(A1,D4.w) ;use Byte "as is"
addq.w #1,D4 ;Offset weitersetzen
h_weiter: cmpi.w #32000,D4 ;bereits alles gelesen?
bne.s h_lese ;nein -> weiter lesen
fertig: clr.l D0 ;Rueckgabewert 0 = alles ok
bra.s exit ;das war's...
; ---------------------------------------------------------------------------
; wenn ID-Byte gelesen wurde, so lese weiteres Byte n und benutze PACK-Byte
; n+1 mal
; ---------------------------------------------------------------------------
h_use_pack: clr.w D0 ;erstmal löschen...
move.b (A0)+,D0 ;lese Anzahl
h_pack_1: move.b D2,0(A1,D4.w) ;PACK-Byte schreiben
addq.w #1,D4 ;Offset weitersetzen
cmpi.w #32000,D4 ;bereits fertig?
dbeq D0,h_pack_1 ;und weiter...
bra.s h_weiter ;naechstes Byte lesen
; ---------------------------------------------------------------------------
; wenn SPEC-Byte gelesen wurde, so lese zwei weitere Bytes d und n - benutze
; Byte d n+1 mal
; ---------------------------------------------------------------------------
h_use_spec: move.b (A0)+,D5 ;weiteres Byte d lesen
clr.w D0 ;erstmal löschen...
move.b (A0)+,D0 ;Anzahl lesen
h_spec_1: move.b D5,0(A1,D4.w) ;Byte d schreiben
addq.w #1,D4
cmpi.w #32000,D4 ;schon fertig?
dbeq D0,h_spec_1 ;und weiter...
bra.s h_weiter ;naechstes Byte lesen
; ---------------------------------------------------------------------------
; Vertikale Auspackroutine
; ---------------------------------------------------------------------------
v_start: addq.l #4,A0 ;Header ueberspringen
v_lese: move.b (A0)+,D0 ;Byte lesen
cmp.b D1,D0 ;ID-Byte gelesen?
beq.s v_use_pack ;ja -> use PACK-Byte
cmp.b D3,D0 ;SPEC-Byte gelesen?
beq.s v_use_spec ;ja -> use SPEC-Byte
move.b D0,0(A1,D4.w) ;use Byte "as is"
addi.l #80,D4 ;Offset-Zeiger weitersetzen
cmpi.w #32000,D4 ;Zeilenüberlauf?
blo.s v_lese ;nein, also weiterlesen
subi.w #31999,D4 ;sonst Korrektur
cmpi.w #80,D4 ;schon alles fertig?
bne.s v_lese ;nein, also weiter
bra.s fertig ;ja -> fertig
; ---------------------------------------------------------------------------
; s.o.
; ---------------------------------------------------------------------------
v_use_pack: clr.w D0 ;erstmal löschen...
move.b (A0)+,D0 ;Anzahl lesen
v_pack_1: move.b D2,0(A1,D4.w) ;PACK-Byte schreiben
addi.l #80,D4 ;Offset weitersetzen
cmpi.w #32000,D4 ;Zeilenüberlauf?
blo.s v_pack_2 ;nein, alles klaro
subi.w #31999,D4 ;sonst Korrektur
cmpi.w #80,D4 ;schon alle Spalten voll?
beq.s fertig ;ja, also Abbruch
v_pack_2: dbra D0,v_pack_1 ;evtl. weiterschreiben...
bra.s v_lese ;und naechstes Byte...
; ---------------------------------------------------------------------------
; s.o.
; ---------------------------------------------------------------------------
v_use_spec: move.b (A0)+,D0 ;weiteres Byte d lesen
clr.w D7 ;erst löschen,
move.b (A0)+,D7 ;dann Anzahl lesen
v_spec_1: move.b D0,0(A1,D4.w) ;Byte d schreiben
addi.l #80,D4 ;Offset weitersetzen
cmpi.w #32000,D4 ;Zeilenüberlauf?
blo.s v_spec_2 ;nein, also weiter
subi.w #31999,D4 ;sonst Offsetkorrektur
cmpi.w #80,D4 ;schon letzte Spalte fertig?
beq fertig ;ja, also Abbruch
v_spec_2: dbra D7,v_spec_1 ;und weiter geht's
bra.s v_lese ;und naechstes Byte...
END